/**
 * 电子秤封装对象
 * @constructor
 */
function ElectronicScale(comPort) {
    //串口对象,若存在指定的串口对象则使用指定串口对象，否则使用默认配置的串口对象
    if(comPort !== undefined){
        this.comPort = comPort;
    }else{
        this.comPort = new ComPort();
    }
    //协议类型（0：采用SCIS协议获取重量信息   1：采用连续数据输出方式获取重量信息）
    this.protocolType = 1;
    this.weightInfo = new WeightInfo();
}

/**
 * 电子秤全局对象，用于启动和关闭刷新重量信息线程
 */
var ElectronicScaleGlobal_T;

/**
 * 打开电子秤设备
 */
ElectronicScale.prototype.openDevice = function () {
    //打开串口
    //return this.comPort.open();

    //将自身引用设置到全局
    // window.ElectronicScaleGlobal = new ElectronicScale();
    window.ElectronicScaleGlobal = this;

    //如果协议类型为SCIS，则设置串口回调为单次执行，并设置回调函数，默认为非单次执行
    if(this.protocolType === 0){
        ElectronicScaleGlobal.comPort.isSingleDataCallback = true;
    }
    //如果协议类型为连续数据包输出类型则添加数据包解析回调
    else if(this.protocolType === 1){
            ElectronicScaleGlobal.comPort.dataCallback = function (data) {
            //解析重量信息数据包
            ElectronicScaleGlobal.weightInfo.parsingDataPackage(data);
        }
    }
    //打开串口
    if(!ElectronicScaleGlobal.comPort.open()){
        console.error("电子秤连接失败！");
        return false;
        // alertMsg("电子秤连接失败，请检查串口连接并安装串口插件！");
    }else{
        console.log("电子秤连接成功！");
        //如果协议类型采用为SCIS协议则使用命令查询方式更新重量信息
        if(this.protocolType === 0){
            ElectronicScaleGlobal_T = setInterval("updateWeightBySCISThread()",1000);
        }
        //如果协议类型采用连续数据输出类型，则采用直接接收数据包解析的方式更新重量信息
        // else if(this.protocolType === 1){
        //     ElectronicScaleGlobal_T = setInterval("updateWeightByDataPackageThread()",1000);
        // }
        return true;
    }
}

/**
 * 处理响应数据字符串
 * @param dataStr
 * @param callback
 */
function handlerResponseDataStr(dataStr,callback){
    //解析打印信息
    var scr = new SCISResponse(dataStr);
    //返回重量信息对象
    if(callback !== undefined){
        callback(scr);
    }
}

/**
 * 查询当前净重值
 * @param callback 回调函数，接收命令响应对象SCISResponse
 */
ElectronicScale.prototype.queryNetWeight = function (callback) {
    //及时获取净重值 //S_D_____129.07_kg
    this.comPort.sendData("SI\r\n",function (dataStr){
        handlerResponseDataStr(dataStr,callback);
    });
}

/**
 * 获取皮重值
 * @param callback 回调函数，接收命令响应对象SCISResponse
 */
ElectronicScale.prototype.queryTareWeight = function (callback) {
    //皮重 //TA_A _ _ _ _ _10.00_kg
    this.comPort.sendData("TA\r\n", function (dataStr) {
        handlerResponseDataStr(dataStr, callback);
    });
}

/**
 * 关闭电子秤设备
 */
ElectronicScale.prototype.closeDevice = function () {
    try{
        try {
            //尝试停止刷新重量信息线程
            if(ElectronicScaleGlobal_T != undefined){
                clearInterval(ElectronicScaleGlobal_T);
            }
        }catch (e) {
            console.log("电子秤重量信息线程停止失败:"+e);
        }
        //关闭串口
        this.comPort.close();
        console.log("电子秤串口已关闭");
    }catch (e) {
        console.error("电子秤串口关闭出错:"+e);
    }


}

/**
 * 通过SCIS协议更新重量信息
 */
function updateWeightBySCISThread() {
    if(!ElectronicScaleGlobal.comPort.isOpen){
        //alertMsg("电子秤连接失败，请连接串口并安装串口插件！");
        console.error("电子秤连接失败，请连接串口并安装串口插件！");
        return;
    }
    //查询净重值
    ElectronicScaleGlobal.queryNetWeight(function (response) {
        try {
            var netWeight = parsingSCISResponse(response);
        }catch (e) {
            return;
        }
        console.log("净重值:"+netWeight);
        if(netWeight == null){
            return;
        }
        // $("#netWeight").val(netWeight);
        // Materialize.updateTextFields();
        //更新净重值
        this.weightInfo.netWeight = netWeight;

        //查询皮重值
        ElectronicScaleGlobal.queryTareWeight(function (re1) {
            var tareWeight;
            try {
                tareWeight = parsingSCISResponse(re1);
            }catch (e) {
                return;
            }
            console.log("皮重值:"+tareWeight);
            if(tareWeight == null){
                return;
            }
            //根据净重和皮重计算毛重值
            var grossWeight = netWeight + tareWeight;
            //更新皮重值
            this.weightInfo.tareWeight = tareWeight;
            //更新毛重值
            this.weightInfo.grossWeight = grossWeight;
            // $("#grossWeight").val(grossWeight);
            // $("#showPang").html(grossWeight);
            // Materialize.updateTextFields();
        });
    });
}

// /**
//  * 通过连续输出数据包更新重量信息
//  */
// function updateWeightByDataPackageThread() {
//
// }

// window.onload = function (ev) {
//     window.ElectronicScaleGlobal = new ElectronicScale();
//     if(!ElectronicScaleGlobal.openDevice()){
//         console.error("电子秤连接失败！");
//         alertMsg("电子秤连接失败，请检查串口连接并安装串口插件！");
//     }else{
//         console.log("电子秤连接成功！");
//         //如果协议类型采用为SCIS协议则使用命令查询方式更新重量信息
//         if(this.protocolType === 0){
//             ElectronicScaleGlobal_T = setInterval("updateWeightBySCISThread()",1000);
//         }
//         //如果协议类型采用连续数据输出类型，则采用直接接收数据包解析的方式更新重量信息
//         else if(this.protocolType === 1){
//             ElectronicScaleGlobal_T = setInterval("updateWeightByDataPackageThread()",1000);
//         }
//     }
// }
// window.onunload = function (ev) {
//     clearInterval(ElectronicScaleGlobal_T);
//     window.ElectronicScaleGlobal.closeDevice();
//     console.log("关闭电子秤串口");
// }
